package org.jimmy.tang.innerclass;

/**
 * @author jimmy
 * 
 */
public class StaicAndNormalInnerclassComparator {
    public static void main(String... arg) {

        // 在其他类中创建一个静态内部类
        // StaticInnerClass aStaticInnerClass = new
        // StaticInnerClass();//必须加OuterClass3
        OuterClass3.StaticInnerClass aStaticInnerClass = new OuterClass3.StaticInnerClass();
        // OuterClass3.StaticInnerClass bStaticInnerClass = new
        // OuterClass3().new
        // StaticInnerClass();//不能用外部类的实例创建静态内部类

        // 在其他类中创建一个非静态内部类
        // OuterClass3.InnerClass aInnerClass = new
        // OuterClass3.InnerClass();//错误，必须用一个外部类的实例new一个非静态内部类
        OuterClass3.InnerClass aInnerClass = new OuterClass3().new InnerClass();

    }

    // 其他类的静态函数和非静态函数创建内部类的方法一致
    public void amethod() {
        // 在其他类中创建一个静态内部类
        OuterClass3.StaticInnerClass aStaticInnerClass = new OuterClass3.StaticInnerClass();

        // 在其他类中创建一个非静态内部类
        // OuterClass3.InnerClass aInnerClass = new
        // OuterClass3.InnerClass();//错误，必须用一个外部类的实例new一个非静态内部类
        OuterClass3.InnerClass aInnerClass = new OuterClass3().new InnerClass();
    }
}

// 称OuterClass3类为外部类
class OuterClass3 {
    static class StaticInnerClass {
    }

    class InnerClass {
    }

    public void method() {
        StaticInnerClass aStaticInnerClass = new StaticInnerClass();
        // 以下两个表明加不加OuterClass3无所谓，对比其他类（其他类必须加OuterClass3）
        OuterClass3.StaticInnerClass bStaticInnerClass = new StaticInnerClass();
        StaticInnerClass cStaticInnerClass = new OuterClass3.StaticInnerClass();

        InnerClass aInnerClass = new InnerClass();
    }

    public static void test() {
        StaticInnerClass aStaticInnerClass = new StaticInnerClass();
        // 以下两个表明加不加OuterClass3无所谓，对比其他类（其他类必须加OuterClass3）
        OuterClass3.StaticInnerClass bStaticInnerClass = new StaticInnerClass();
        StaticInnerClass cStaticInnerClass = new OuterClass3.StaticInnerClass();

        // InnerClass aInnerClass = new
        // InnerClass();//错误，在静态方法中不能直接创建非静态内部类，必须要有外部类的实例
        OuterClass3.InnerClass aInnerClass = new OuterClass3().new InnerClass();
    }
}
